package com.idroc.cdfs.service.meta;

import java.io.Serializable;
import java.util.TreeMap;

/**
 * 提供注册相关服务的端点
 * @author www.tianya.cn
 * @creator 詹都林 (zhandl@hainan.net) 
 * Aug 11, 2009 1:55:28 PM
 * @memo:
 */
public interface RegistryEndpoint extends Serializable {
	
	/**
	 * 获取端点编号
	 * @return -- 端点编号
	 */
	Integer getEndpointNo();
	
	/**
	 * 获取端点主机ip
	 * @return -- 主机ip
	 */
	String getEndpointHost();
	
	/**
	 * 获取端点端口
	 * @return -- 端口
	 */
	Integer getEndpointPort();
	
	/**
	 * 获取根端点
	 * @return -- 根端点
	 */
	RegistryEndpoint getRootEndpoint();
	
	/**
	 * 获取已经注册地端点集合
	 * @return -- 已经注册地端点集合
	 */
	TreeMap<Integer, RegistryEndpoint> getRegisteredEndpoint();
	
	/**
	 * 注册一个端点
	 * @param ep -- 注册端点
	 * @return -- true, 注册成功
	 */
	boolean registerEndpoint(RegistryEndpoint ep);
	
	/**
	 * 取消注册一个端点
	 * @param epNo -- 端点编号
	 * @return -- true, 取消成功
	 */
	boolean unregisterEndpoint(Integer epNo);
	
	/**
	 * 增加一个端点到已注册集合中
	 * @param fromRoot -- 要求增加来自根端点 
	 * @param newArrive -- 被新加入的端点
	 * @return -- true, 增加成功
	 */
	boolean addEndpoint(RegistryEndpoint fromRoot, RegistryEndpoint newArrive);
	
	/**
	 * 移除已注册端点集合中的一个端点
	 * @param fromRoot -- 要求移除来自根端点
	 * @param epNo -- 被移除的端点编号
	 * @return -- true, 移除成功
	 */
	boolean dropEndpoint(RegistryEndpoint fromRoot, Integer epNo);
	
	/**
	 * 重建根端点
	 * @param nested -- 是否嵌套重建
	 * @return -- 最新的根端点
	 */
	RegistryEndpoint rebuildRootEndpoint(boolean nested);
	

	/**
	 * 检测此端点是否存活
	 * @return -- true, 存活
	 */
	boolean checkAlive();
	
	/**
	 * 取代当前根端点
	 * @param ep -- 最新的跟端点
	 * @return -- true, 取代成功
	 */
	boolean replaceRootEndpoint(RegistryEndpoint ep);
}
